// P1
new Promise(function (resolve, reject) {
  console.log("AAAA");
  resolve();
})
  .then(function () {
      // P2
    new Promise(function (resolve, reject) {
      console.log("BBBB");
      resolve();
    })
      .then(function () {
        console.log("CCCC");
      })
      .then(function () {
        // P3
        new Promise(function (resolve, reject) {
          console.log("DDDD");
          resolve();
        })
          .then(function () {
            console.log("EEEE");
          })
          .then(function () {
            console.log("FFFF");
          });
        console.log("GGGG");
      });
    console.log("HHHH");
  })
  .then(function () {
    console.log("IIII");
  });
// P4
new Promise(function (resolve, reject) {
  console.log("JJJJ");
  resolve();
})
  .then(function () {
    console.log("KKKK");
  })
  .then(function () {
    console.log("LLLL");
  });

// 同步代码 AAAA JJJJ
// 第一次轮询，宏任务没有，找到then中的回调，作为第一个微任务并执行
// 执行器BBBB 打印语句HHHH
// 一个微任务中的promise又有一个then，产生一个新的微任务，这个微任务会被放到下一轮微任务队列的第一个
// 

// 因为每个Promise都会产生一个微任务，所以最外层的两个Promise的第一个then会进入到第一轮的微任务当中，下面我们来单独看这两个then。
// 第一个Promise的第一个then里面又new了一个新的Promise，这个新的Promise产生一个微任务，本轮的微任务已经在执行当中了，所以这个微任务会被排到下一个微任务队列的第一位，还是先执行里面的同步语句，打印BBBB和HHHH，之后运行第二个Promise的第一个then，打印KKKK。

// 第一轮微任务执行完毕，开始第二轮微任务，先执行第三个Promise的第一个then，打印CCCC，继续执行第一个Promise的第二个then，打印IIII，最后执行第二个Promise的第二个then，打印LLLL。

// 第三轮微任务开始，执行第三个Promise的第二个then，这个then里面又new了一个新的Promise，同理，新的Promise（第四个）产生的微任务放入下一轮第一个执行，此时执行同步语句，打印DDDD和GGGG。

// 第四轮微任务开始执行第四个Promise的第一个then，打印EEEE。

// 第五轮微任务开始执行第四个Promise的第二个then，打印FFFF。

// 综上，我们最后得到的结果就是：

// AAAA JJJJ BBBB HHHH KKKK CCCC IIII LLLL DDDD GGGG EEEE FFF

// 首先，同步代码先行
// P1中的执行器先执行打印AAAA, 这时发现了P1的第一个then，将其回调推入第一轮微任务队列
// Microtasks_1: [P1.then1]
// 然后移步到P4， 也是执行器先执行，打印JJJJ， 这时发现了P4的第一个then, 将其回调推入第一轮任务队列
// Microtasks_1: [P1.then1, P4.then1]
// 这时同步代码执行完了，看下异步队列有无任务，没有宏任务但有微任务，按顺序执行微任务

/** 第一轮微任务队列执行 */

// P1.then1执行
// 一样，同步代码优先执行， 打印BBBB HHHH
// P2.then1推入第二轮微任务队列
// Microtasks_2: [P2.then1]
// P1.then1执行完之后将P1.then2推入微任务队列
// Microtasks_2: [P2.then1, P1.then2]
// P4.then1执行
// 打印KKKK
// P4.then1执行完之后将P4.then2推入微任务队列
// Microtasks_2: [P2.then1, P1.then2, P4.then2]

/** 第二轮微任务队列执行 */
// P2.then1执行, 打印CCCC
// 将P2.then推入第三轮微任务队列
// Microtasks_3: [P2.then2]
// P1.then2执行, 打印IIII
// P4.then2执行, 打印LLLL

/** 第三轮微任务队列执行 */
// P2.then2执行, 打印DDDD，将P3.then1推入第四轮微任务队列
// Microtasks_4: [P3.then1]
// 同步代码 打印GGGG

/** 第四轮微任务队列执行 */
// P3.then1执行打印EEEE，将P3.then2推入第五轮微任务队列
// Microtasks_5: [P3.then2] 打印FFFF